Spring面试题 |
您所在的位置:网站首页 › spring 中的 bean 是线程安全的吗 › Spring面试题 |
Spring面试题
1、说说你对Spring的理解?
1、Spring是一个开源框架,主要是为简化企业级应用开发而生。可以实现EJB可以实现的功能,Spring是一个IOC和AOP容器框架。 ① 控制反转(IOC):Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring为我们提供的对象即可,这就是控制反转的思想。 ② 依赖注入(DI):Spring使用Java Bean对象的Set方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。 ③ 面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。 2、在Spring中有几种配置Bean的方式?(高频)配置方式: 1、基于XML的配置 2、基于注解的配置 3、基于Java的配置 3、BeanFactory和ApplicationContext有什么区别?(高频)1、BeanFactory:BeanFactory在启动的时候不会去实例化Bean,当从容器中拿Bean的时候才会去实例化; 2、ApplicationContext:ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化; 4、Spring框架中的单例bean是线程安全的吗?(高频)肯定不是线程安全的,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更“prototype”。 5、你用过哪些重要的Spring注解?(高频)1、@Controller - 用于 Spring MVC 项目中的处理器类。 2、@Service - 用于服务类。 3、@RequestMapping - 用于在控制器处理程序方法中配置 URI 映射。 4、@ResponseBody - 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。 5、@PathVariable - 用于将动态值从 URI 映射到处理程序方法参数。 6、@Autowired - 用于在 spring bean 中自动装配依赖项。通过类型来实现自动注入bean。和@Qualifier注解配合使用可以实现根据name注入bean。 7、@Qualifier - 和@Autowired一块使用,在同一类型的bean有多个的情况下可以实现根据name注入的需求。 8、@Scope - 用于配置 spring bean 的范围。 9、@Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。 10、@Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP) 6、spring中aop的底层是怎么实现的?(高频)Spring中AOP底层的实现是基于动态代理进行实现的。 常见的动态代理技术有两种:JDK的动态代理和CGLIB。 两者的区别如下所示: 1、JDK动态代理只能对实现了接口的类生成代理,而不能针对类 2、Cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法进行增强,但是因为采用的是继承,所以该类或方法最好不要声明为 final,对于final类或方法,是无法继承的。 Spring如何选择是用JDK还是cglib? 1、当bean实现接口时,会用JDK代理模式 2、当bean没有实现接口,会用cglib实现 3、可以强制使用cglib 应用场景: 1、统一日志处理 2、统一幂等性的处理 3、spring中内置的事务处理 4、系统的日志收集 5、事务控制 6、权限控制 7、全局异常的处理 8、性能监控 8、什么是事务的传播行为?在Spring框架中都有哪些事务的传播行为?Spring的事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法对事务的态度。 举例:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。 在Spring中提供了7种事务的传播行为: 1、REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。 2、REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。 3、SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。 4、NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 5、MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。 6、NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 7、NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。 9、spring如何管理事务的?(高频)Spring事务管理主要包括3个接口,Spring事务主要由以下三个共同完成的: 1、PlatformTransactionManager:事务管理器,主要用于平台相关事务的管理。 主要包括三个方法: ① commit:事务提交。 ② rollback:事务回滚。 ③ getTransaction:获取事务状态。 2、TransacitonDefinition:事务定义信息,用来定义事务相关属性,给事务管理器PlatformTransactionManager使用 主要包含的方法: ① getIsolationLevel:获取隔离级别。 ② getPropagationBehavior:获取传播行为。 ③ getTimeout获取超时时间。 ④ isReadOnly:是否只读(保存、更新、删除时属性变为false–可读写,查询时为true–只读) 3、TransationStatus:事务具体运行状态,事务管理过程中,每个时间点事务的状态信息。 主要包含的方法: ① hasSavepoint():返回这个事务内部是否包含一个保存点。 ② isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚。 ③ isNewTransaction():判断当前事务是否是一个新事务。 10、Spring事务什么情况下会失效?(高频)事务失效的常见场景: 1、数据库引擎不支持事务:这里以 MySQL为例,其MyISAM引擎是不支持事务操作的,InnoDB才是支持事务的引擎,一般要支持事务都会使用 InnoDB。 2、bean没有被Spring管理 如果此时把 @Service注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被Spring 管理了,事务自然就失效了。 3、方法不是public的:@Transactional只能用于public的方法上,否则事务不会失效。 4、自身调用问题 5、数据源没有配置事务管理器 6、异常在方法内部通过try…catch处理掉了 7、异常类型错误:事务默认回滚的是:RuntimeException 11、请解释一下spring bean的生命周期?(高频)Spring Bean的生命周期如下图所示: 1、实例化Bean: 2、设置对象属性(依赖注入):实例化后的对象被封装在BeanWrapper对象中,紧接着Spring根据BeanDefinition中的信息以及通过BeanWrapper提供的设置属性的接口完成依赖注入。 3、处理Aware接口 4、Bean的后置处理器(BeanPostProcessor) 5、InitializingBean 与 init-method:如果Bean在Spring配置文件中配置了init-method 属性,则会自动调用其配置的初始化方法。 6、Bean的后置处理器(BeanPostProcessor):如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。 7、DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法; 8、destroy-method:最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。 12、什么是Spring的循环依赖?(高频)简单的来说就是A依赖B的同时,B依赖A。在创建A对象的同时需要使用的B对象,在创建B对象的同时需要使用到A对象 13、出现循环依赖以后会有什么问题?(高频)对象的创建过程会产生死循环,如下所示: 在spring中通过某些机制(三级缓存)帮开发者解决了部分循环依赖的问题。 14、spring如何解决循环依赖的?(高频)Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |